#coding: utf8
from Jugador import Jugador
from Carta import Carta
from Mazo import Mazo
from Corazones import JuegoCorazones

def prueba_constructor():
	jugadores=[Jugador(0,"Raul"),Jugador(1,"Federico"),Jugador(2,"Samuel"),Jugador(3,"Francisco")]
	juego=JuegoCorazones(jugadores)
	assert juego!=None
	assert juego.jugadores==jugadores
	assert juego.puntajes==[0,0,0,0]
	assert juego.cartas_juntadas==[[],[],[],[]]
	
def prueba_termino():
	jugadores=[Jugador(0,"Raul"),Jugador(1,"Federico"),Jugador(2,"Samuel"),Jugador(3,"Francisco")]
	juego=JuegoCorazones(jugadores)
	#Los puntajes de todos los jugadores son menores a 100
	assert juego.termino()==False
	#El puntaje del jugador con numero de id 3 supera los 100 puntos
	juego.puntajes[3]=120
	assert juego.termino()==True

def prueba_imprimir_puntajes():
	jugadores=[Jugador(0,"Raul"),Jugador(1,"Federico"),Jugador(2,"Samuel"),Jugador(3,"Francisco")]
	juego=JuegoCorazones(jugadores)
	imprimio=False
	#Prueba si imprime
	juego.imprimir_puntajes()
	imprimio=True
	assert imprimio
	
def prueba_barajar():
	jugadores=[Jugador(0,"Raul"),Jugador(1,"Federico"),Jugador(2,"Samuel"),Jugador(3,"Francisco")]
	juego=JuegoCorazones(jugadores)
	juego.barajar()
	for id_jugador in xrange(len(juego.jugadores)):
		assert len((juego.jugadores[id_jugador]).mano)==13 #recibio 13 cartas

def prueba_identificar_jugador_que_inicia():
	jugadores=[Jugador(0,"Raul"),Jugador(1,"Federico"),Jugador(2,"Samuel"),Jugador(3,"Francisco")]
	juego=JuegoCorazones(jugadores)
	juego.jugadores[3].recibir_carta(Carta(2, Carta.TREBOLES)) #El jugador de id nro 3 recibe el 2 de treboles
	
	assert juego.identificar_jugador_que_inicia()==3

def prueba_identificar_jugador_que_perdio():
	jugadores=[Jugador(0,"Raul"),Jugador(1,"Federico"),Jugador(2,"Samuel"),Jugador(3,"Francisco")]
	juego=JuegoCorazones(jugadores)
	cartas_jugadas = [Carta(2,Carta.TREBOLES),Carta(1,Carta.TREBOLES),Carta(12,Carta.TREBOLES),Carta(1,Carta.CORAZONES)]
	id_perdedor = juego.identificar_jugador_que_perdio(cartas_jugadas,2)
	#El primero que jugo fue el 2 entonces siguiendo el orden de cartas_jugadas, el que debería perder es el 3
	assert id_perdedor == 3
	cartas_jugadas2 = [Carta(5,Carta.TREBOLES),Carta(1,Carta.PICAS),Carta(6,Carta.TREBOLES),Carta(1,Carta.CORAZONES)]
	id_perdedor2 = juego.identificar_jugador_que_perdio(cartas_jugadas2,3)
	assert id_perdedor2 == 1
	
def prueba_procesar_e_informar_resultado():
	jugadores=[Jugador(0,"Raul"),Jugador(1,"Federico"),Jugador(2,"Samuel"),Jugador(3,"Francisco")]
	juego=JuegoCorazones(jugadores)
	cartas_jugadas = [Carta(2,Carta.TREBOLES),Carta(1,Carta.TREBOLES),Carta(12,Carta.TREBOLES),Carta(1,Carta.CORAZONES)]
	id_perdedor = juego.identificar_jugador_que_perdio(cartas_jugadas,2)
	id_primero = 2
	assert juego.cartas_juntadas[id_perdedor] == []
	juego.procesar_e_informar_resultado(cartas_jugadas,id_primero,id_perdedor)
	assert juego.cartas_juntadas[id_perdedor] == cartas_jugadas
	# Si hay alguna forma de probar que se le hace conocer la jugada al jugador faltaría hacerlo
	
def prueba_hay_corazones():
	jugadores=[Jugador(0,"Raul"),Jugador(1,"Federico"),Jugador(2,"Samuel"),Jugador(3,"Francisco")]
	juego=JuegoCorazones(jugadores)
	cartas=[Carta(3,Carta.TREBOLES),Carta(1,Carta.CORAZONES)]
	assert juego.hay_corazones(cartas)
	cartas=[Carta(3,Carta.TREBOLES),Carta(4,Carta.TREBOLES),Carta(12,Carta.TREBOLES)]
	assert not juego.hay_corazones(cartas)

def prueba_realizar_jugada():
	jugadores=[Jugador(0,"Raul"),Jugador(1,"Federico"),Jugador(2,"Samuel"),Jugador(3,"Francisco")]
	juego=JuegoCorazones(jugadores)
	juego.barajar()
	#Antes de jugar deben tener 13 cartas cada uno
	for jugador in jugadores:
		assert len(jugador.mano) == 13
	id_jugador_que_inicia = juego.identificar_jugador_que_inicia()
	for x in range (1,10+1):
		juego.realizar_jugada(1,x,id_jugador_que_inicia%4,True)
		id_jugador_que_inicia += 1
	#Después de jugar 10 manos, los jugadores deben tener 10 cartas en la mano cada uno
	for jugador in jugadores:
		assert len(jugador.mano) == 3
	
def prueba_calcular_puntajes ():
	jugadores=[Jugador(0,"Raul"),Jugador(1,"Federico"),Jugador(2,"Samuel"),Jugador(3,"Francisco")]
	juego=JuegoCorazones(jugadores)
	juego.cartas_juntadas=[[Carta(1,Carta.CORAZONES)],[Carta(12,Carta.TREBOLES)],[],[Carta(12,Carta.PICAS),Carta(2,Carta.CORAZONES)]]
	juego.calcular_puntajes()		
	assert juego.puntajes==[1,0,0,14] #El jugador de id nro 0 sumo 1 punto por tener corazones y el de id nro 3 14 por haber juntado la q de picas y un corazon
	assert juego.cartas_juntadas==[[],[],[],[]]#Luego de calcular puntajes, las cartas juntadas se incorporan nuevamente al mazo
	todos_los_corazones_y_q_de_picas=[]
	
	for numero in xrange (1,14):
		todos_los_corazones_y_q_de_picas.append(Carta(numero,Carta.CORAZONES))
	
	todos_los_corazones_y_q_de_picas.append(Carta(12,Carta.PICAS))
	
	juego.cartas_juntadas=[todos_los_corazones_y_q_de_picas,[Carta(12,Carta.TREBOLES)],[],[Carta(13,Carta.PICAS)]]
	#El jugador de id nro 0 alcanzo el cielo por lo tanto todos los demas obtienen 26 puntos, y el, 0
	juego.calcular_puntajes()
	assert juego.puntajes==[1+0,0+26,0+26,14+26]
	assert juego.cartas_juntadas==[[],[],[],[]]

def prueba_intercambiar_cartas():
	jugadores=[Jugador(0,"Raul"),Jugador(1,"Federico"),Jugador(2,"Samuel"),Jugador(3,"Francisco")]
	juego=JuegoCorazones(jugadores)
	juego.barajar()
	cartas_por_jugador=[]
	for jugador in juego.jugadores:
		cartas_por_jugador.append(jugador.mano)
	for nro_mano in range(1,5):
		juego.intercambiar_cartas(nro_mano)
		if nro_mano in range(1,4):
			for jugador in juego.jugadores:
				id_jug=jugador.obtener_id_jugador()
				if nro_mano==1:
					id_jug_ant=(id_jug-1)%4 #Si nro de mano es 1 Por ejemplo para el de ID 0 el anterior seria el de ID 3
				elif nro_mano==2:
					id_jug_ant=(id_jug+1)%4 #Si el nro de mano es 2 Por ejemplo para el de ID 0 el anterior seria el de ID 1
				elif nro_mano==3:
					id_jug_ant=(id_jug+2)%4 #Si el numero de mano es 3 Por ejemplo para el de ID 0 el anterior seria el de ID 2				
				
				#Verifica si hay cartas que antes eran del jugador anterior en la mano del jugador actual y verifica si son tres
				cartas_intercambiadas=0
				for carta in cartas_por_jugador[id_jug_ant]:
					if carta in (juego.jugadores[id_jug].mano):
						cartas_intercambiadas+=1
	
				assert cartas_intercambiadas==3
		if nro_mano==4:
			#Si el nro de mano es 4 no hay intercambios
			for jugador in juego.jugadores:
				assert jugador.mano==cartas_por_jugador[jugador.obtener_id_jugador()] #Verifica que no haya habido cambios en las cartas de los jugadores
			

def prueba_ganadores():
	jugadores=[Jugador(0,"Raul"),Jugador(1,"Federico"),Jugador(2,"Samuel"),Jugador(3,"Francisco")]
	juego=JuegoCorazones(jugadores)
	juego.puntajes=[2,2,2,1]
	assert juego.ganadores()==[juego.jugadores[3]] #Una lista con el unico jugador que gano
	juego.puntajes=[7,9,10,7]
	assert juego.ganadores()==[juego.jugadores[0],juego.jugadores[3]] #Ganaron el jugador de id nro 0 y el de id nro 3

def prueba_jugar_mano():
	#Este metodo solo se encarga de llamar ciclicamente a los otros metodos.
	pass
	
def prueba_jugar():
	#Este metodo solo se encarga de llamar ciclicamente a los otros metodos
	pass
		
def pruebas_corazones():
	print "Pruebas Corazones\n\r"
	for prueba in (
		prueba_constructor,
		prueba_termino,
		prueba_imprimir_puntajes,
		prueba_barajar,
		prueba_identificar_jugador_que_inicia,
		prueba_identificar_jugador_que_perdio,
		prueba_procesar_e_informar_resultado,
		prueba_hay_corazones,
		prueba_realizar_jugada,
		prueba_calcular_puntajes,
		prueba_ganadores,
		prueba_jugar_mano,
		prueba_jugar
	):
		print (prueba.__name__ + ":"),
		prueba()
		print "OK"

pruebas_corazones()

	
